# coding=utf-8
from django_redis import get_redis_connection
from rest_framework import serializers

from .models import User
from rest_framework_jwt.settings import api_settings


class RegisterUserSerializer(serializers.ModelSerializer):
    #write_only: 只写,只校验, 不入库, 也不需要返回到前端浏览
    password2 = serializers.CharField(min_length=8,max_length=20,label="确认密码",write_only=True)
    sms_code = serializers.CharField(min_length=6,max_length=6,label="短信验证码",write_only=True)
    allow = serializers.CharField(label="协议",write_only=True)
    token = serializers.CharField(label="jwt口令", read_only=True)

    class Meta:
        model = User
        fields = ("id","username","password","password2","mobile","sms_code","allow","token")

        read_only_fields = ("id",)

        extra_kwargs = {
            "password":{
                "min_length":8,
                "max_length":20,
                "write_only":True
            }
        }

    #1,单字段校验,allow协议
    def validate_allow(self, value):

        if value != 'true':
            raise serializers.ValidationError("必须同意协议")

        return value


        # 2,校验多字段, 密码, 短信

    # 2,多字段校验
    def validate(self, attrs):

        # 0,取出手机号,和短信验证码
        sms_code = attrs["sms_code"]
        mobile = attrs["mobile"]

        # 1,校验密码
        if attrs["password"] != attrs["password2"]:
            raise serializers.ValidationError("两次密码不相等")

        # 2,校验短信
        redis_conn = get_redis_connection("code")
        redis_sms_code = redis_conn.get("sms_code_%s" % mobile)

        # 3,判断是否过期
        if not redis_sms_code:
            raise serializers.ValidationError("短信验证码已经过期")

        # 4,校验正确性
        if sms_code != redis_sms_code.decode():
            raise serializers.ValidationError("短信验证码填写错误")

        # 5,返回
        return attrs

    #3,由于User中没有password2,sms_code,allow,所以需要去除
    def create(self, validated_data):
        #1,去除不需要的数据
        del validated_data["password2"]
        del validated_data["sms_code"]
        del validated_data["allow"]

        #2,创建对象
        user = super(RegisterUserSerializer, self).create(validated_data)

        #2,1密码加密
        user.set_password(validated_data["password"]) #修改的代码
        user.save()

        #设置JWT

        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        user.token = token

        #3,返回
        return user

